﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestorDeFlotasDesktop.UILogic;
using GestorDeFlotasModelo.Entities;
using GestorDeFlotasModelo.Factorias;
using GestorDeFlotasDesktop.AbmChofer;
using GestorDeFlotasDesktop.UILogic.Helpers;

namespace GestorDeFlotasDesktop.RendirViajes
{
    public partial class frmRendirViajes : BaseForm
    {
        Chofer choferSeleccionado;
        frmListadoChofer abmChofer;

        public frmRendirViajes()
        {
            InitializeComponent();
        }

        protected override void OnVisibleChanged(EventArgs e)
        {
            try
            {
                base.OnVisibleChanged(e);

                List<Turno> turnos = Transaccion.Factoria<FactoriaTurno>().SelectTodos<Turno>();

                cmbTurnos.ValueMember = "id";
                cmbTurnos.DisplayMember = "TurnoString";
                cmbTurnos.Items.AddRange(turnos.ToArray());

                butRendicNueva.Visible = false;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void frmRendirViajes_Load(object sender, EventArgs e)
        {
            
        }

        void abmChofer_choferSeleccionado(object s, object e)
        {
            this.choferSeleccionado = abmChofer.ChoferElegido;

            txtChofer.Text = this.choferSeleccionado.Apellido + " " + this.choferSeleccionado.Nombre;
        }

        private void butSeleccionarChofer_Click(object sender, EventArgs e)
        {
            abmChofer = new frmListadoChofer(true, true);
            abmChofer.ChoferSeleccionado += new EventHandler(abmChofer_choferSeleccionado);

            abmChofer.Show();
        }

        private void butRendir_Click(object sender, EventArgs e)
        {
            try
            {
                if (ValidForm())
                {
                    if (!choferSeleccionado.Habilitado)
                        MessageBox.Show("El chofer seleccionado debe estar habilitado", "Rendicion", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    else
                    {
                        List<Rendicion> rend = Transaccion.Factoria<FactoriaRendicion>().SelectParaRendicion(this.choferSeleccionado.Id, ((Turno)cmbTurnos.SelectedItem).Id, dtpFecha.Value);
                        if (rend.Count > 0)
                            MessageBox.Show("Ya se registró una rendición para esos datos", "Rendicion", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        else
                            RegistrarRendicion();
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void RegistrarRendicion()
        {
            List<Viaje> viajes = Transaccion.Factoria<FactoriaViaje>().SelectParaRendicion(this.choferSeleccionado.Id, ((Turno)cmbTurnos.SelectedItem).Id, dtpFecha.Value);

            if (viajes.Count == 0)
                MessageBox.Show("No se registraron viajes para esa fecha, turno y chofer", "Rendicion", MessageBoxButtons.OK, MessageBoxIcon.Error);
            else
            {
                double recaudacion = Math.Round(viajes.Sum(x => x.PrecioViaje), 2);

                if (Convert.ToDouble(txtRecaudacion.Text) != recaudacion)
                    MessageBox.Show("El monto de la recaudación no se corresponde para los viajes registrados para esa fecha, turno y chofer", "Rendicion", MessageBoxButtons.OK, MessageBoxIcon.Error);
                else
                {
                    try
                    {
                        Rendicion rend = Transaccion.Factoria<FactoriaRendicion>().Nuevo(dtpFecha.Value, this.choferSeleccionado, (Turno)cmbTurnos.SelectedItem, Convert.ToDouble(txtRecaudacion.Text));
                        Transaccion.Persistir();
                        MessageBox.Show("La rendición se ha guardado con éxito");
                        foreach (Viaje viaje in viajes)
                            viaje.Rendicion = rend;
                        Transaccion.Persistir();
                        dgvViajes.Visible = true;
                        dgvViajes.DataSource = viajes;
                        butRendicNueva.Visible = true;
                    }catch
                    {
                        throw;
                    }
                }
            }

        }

        private bool ValidForm()
        {
            string error = string.Empty;

            if (this.choferSeleccionado == null)
                error += "Debe seleccionar un chofer " + Environment.NewLine;
            if (string.IsNullOrEmpty(txtRecaudacion.Text) || !ValidatorHelper.isNumericDoubleFieldValid(txtRecaudacion.Text))
                error += "Debe ingresar una recaudacion válida " + Environment.NewLine;
            if (cmbTurnos.SelectedItem == null)
                error += "Debe seleccionar un turno " + Environment.NewLine;

            if (string.IsNullOrEmpty(error))
                return true;
            
            MessageBox.Show(error, "Rendicion", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return false;
        }

        private void butRendicNueva_Click(object sender, EventArgs e)
        {
            try
            {
                this.choferSeleccionado = null;
                txtChofer.Text = string.Empty;
                txtRecaudacion.Text = string.Empty;
                cmbTurnos.SelectedItem = null;
                dgvViajes.DataSource = null;
                dgvViajes.Visible = false;
                butRendicNueva.Visible = false;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}
